import crcmod


# 计算 CRC-16 不同模式校验值
def calculate_crc16(data):
    # CRC-16-IBM模式
    crc16_fun = crcmod.mkCrcFun(0x18005, initCrc=0x0000, rev=True, xorOut=0x0000)
    crc_value = crc16_fun(data)
    print(f"crc16 ibm: {crc_value:04X}")

    # CCITT模式
    crc16_fun = crcmod.mkCrcFun(0x11021, initCrc=0xFFFF, rev=False, xorOut=0x0000)
    crc_value = crc16_fun(data)
    print(f"crc16 CCITT: {crc_value:04X}")

    # modbus模式
    crc16_fun = crcmod.mkCrcFun(0x18005, rev=True, initCrc=0xFFFF, xorOut=0x0000)
    crc_value = crc16_fun(data)
    print(f"crc16 modbus: {crc_value:04X}")

    return crc_value


# 计算 CRC-32 校验值
def calculate_crc32(data):
    # 定义 CRC-32 的多项式和初始值
    crc32 = crcmod.mkCrcFun(
        0x104C11DB7, initCrc=0xFFFFFFFF, rev=True, xorOut=0xFFFFFFFF
    )
    crc_value = crc32(data)
    return crc_value


if __name__ == "__main__":
    # 示例数据
    data = b"Hello, World!"

    # 计算 CRC-16-IBM 校验值
    crc16_value = calculate_crc16(data)
    print(f"CRC-16-IBM: {crc16_value:04X}")

    # 计算 CRC-32 校验值
    crc32_value = calculate_crc32(data)
    print(f"CRC-32: {crc32_value:08X}")
